#include<iostream>
#include<string>
#include<functional>
#include<vector>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include <cstdlib>
#include<signal.h>

using namespace std;

// typedef function<void ()> func;

// vector<func> callbacks;

// uint64_t count = 0;

// void showCount()
// {
//     //cout << "进程捕捉到了一个信号，正在处理中：" << signum << " pid: " << getpid() << endl;

//     cout << "final count: " << count << endl;
// }

// void showLog()
// {
//     cout << "这个是日志功能" << endl;
// }

// void logUser()
// {
//     if (fork() == 0)
//     {
//         execl("/usr/bin/who", "who", nullptr);
//         exit(1);
//     }
//     wait(nullptr);
// }

// void flushdate()
// {
    
// }

// // 定时器功能
// // sig:
// void catchSig(int signum)
// {
//     for(auto &f : callbacks)
//     {
//         f();
//     }
//     alarm(1);
// }

// static void Usage(string proc)
// {
//     cout << "Usage: \r\n\t" << proc << " signumber processid" << endl;
// }

void handler(int signum)
{
    sleep(1);
    cout << "获得了一个信号：" << signum << endl;
    exit(1);
}

// ./mykill 2 pid
int main(int argc, char *argv[])
{
    // signal(SIGFPE, handler);
    // int a = 100;
    // a /= 0;

    signal(SIGSEGV, handler);
    int *p = nullptr;
    *p = 100;


    while (true) sleep(1);

    // // 验证1秒之内，会进行多少次count++
    // // 1.为什么我只进行到2W多呢？ cout + 网络发送 = IO
    // alarm(1); // 设置了一个闹钟，这个闹钟一旦触发了，就自动移除了

    // // 2. 如果单纯想计算算力呢？
    // signal(SIGALRM, catchSig);

    // callbacks.push_back(showCount);
    // callbacks.push_back(showLog);
    // callbacks.push_back(logUser);
    // while(true) count++;


//     cout << "我开始运行了" << endl;
//     sleep(1);
//    // raise(8);  // rasie(6) kill(getpid(), 6)
//     abort(); // 通常用来终止进程！

    // if(argc != 3)
    // {
    //     Usage(argv[0]);
    //     exit(1);
    // }

    // int signumber = atoi(argv[1]);
    // int procid = atoi(argv[2]);

    // kill(procid, signumber);



    // signal(2, fun);
    // signal(SIGINT, catchSig);   // 特定信号的处理动作，一般只有一个
    // // ctrl \;
    // signal(SIGQUIT, catchSig);
    // signal函数，仅仅是修改进程对特定信号的后续处理动作，不是直接调用对应的处理动作
    // 如果后续没有任何SIGINT信号产生，catshSih会不会被调用？？ 永远也不会被调用

    // while (true)
    // {
    //     cout << "我是一个进程，我正在运行..., pid: " << getpid() << endl;
    //     sleep(1);

    //     int a = 100;
    //     a /= 0;

    //     cout << "run here ...." << endl;
    // }


    // pid_t id = fork();

    // if(id == 0)
    // {
    //     sleep(1);
    //     int a = 100;
    //     a /= 0;
    //     exit(1);
    // }

    // int status = 0;
    // waitpid(id, &status, 0);
    // cout << "父进程：" << getpid() << " 子进程" << id << " exit sig: " <<\
    //  (status & 0x7F) << "is core: " << ((status >> 7) & 1) << endl;
    return 0;
}